package lpca.steps
{
	import kioschool.model.AbstractStep;
	import kioschool.view.IStepView;	
	import lpca.controllers.LpcaController;
	import lpca.controllers.SecondaryController;	
	import lpca.model.LpcaModel;
	import lpca.utils.Cell;
	/**
	 * ...
	 * @author D.Shakshin
	 */
	//вместо номера шага использовать стек ячеек
	public class WaveByStep extends LpcaAbstractStep
	{								
		/**
		 * Решает шаг - выполняется в режиме демонстрации при переходе на следующий шаг
		 */
		override public function oracle():void 
		{					
			trace("oracle step: " + this.step + 1);			
			this.model.oracleWave(step + 1);		
			var selector: Vector.<int> = new Vector.<int>;
			selector.push(LpcaModel.checked);			
			this.model.setVectorPoint(this.model.getVectorOracleWave(step + 1),  selector, null, null, true);															
		}		
		
		override public function antiOracle():void
		{																		
			var selector: Vector.<int> = new Vector.<int>;			
			selector.push(LpcaModel.visibleValueWave);
			this.model.setVectorPoint(this.model.getVectorOracleWave(step + 1), selector, null, false, null);
			this.model.clearStackChange();
		}
			
		override public function restore():void
		{												
			var selector: Vector.<int> = new Vector.<int>;
			selector.push(LpcaModel.visibleValueWave);			
			this.model.setVectorPoint(this.model.getVectorOracleWave(step + 1), selector, null, false, false);
			this.model.clearStackChange();
		}
		
		/**
		 * Получает следующий шаг
		 */
		override public function next(): AbstractStep
		{									
			trace("next() from step:" + this.step);
			var selector: Vector.<int> = new Vector.<int>;
			selector.push(LpcaModel.visibleValueWave);
			selector.push(LpcaModel.checked);
			this.model.setVectorPoint(this.model.stackChange, selector, null, true, false);
			this.model.clearStackChange();
			if ((this.step < model.getCountStep()))//если следующий шаг есть
				{																													
					return new WaveByStep(step+1);
				}
			else  						
				return new TraceByStep(0);// переход на следующий этап: ввод маршрута				
			return null;
		}
				
		/**
		 * Проверяет действия пользователя на данном шаге - выполняется в режиме тренировки и контроля при переходе на следующий шаг
		 */
		override public function checkInput():String {												
			if (this.step == this.model.getCountStep())
				return null;
			var correct: Boolean = model.checkWave(step + 1);		
			if (!correct)		
			{
				var selector: Vector.<int> = new Vector.<int>;
				selector.push(LpcaModel.checked);
				this.model.setVectorPoint(this.model.stackChange, selector, null, null, false);
				this.model.clearStackChange();
			}										
			return (correct)? null :"ошибка";
		}		
		
		/**
		 * Возвращает комментарий для данного шага
		 */
		override public function get comment():String {			
			return "На этом шаге необходимо выбрать точки волны";									
		}		
		
		override public function update():void
		{					
			trace("Update SaveSteps" + this.getStep());																			
			this.model.step = this.step;		
			this.model.clearStackChange();
		}
		
		public function getStep(): int
		{
			return step;
		}
		
		public function WaveByStep(step: int) 
		{			
			trace("Простановка волны. Подсветка начальных ячеек step " + step);						
			this.model = SecondaryController.instance.model;						
			this.model.step = step;
			this.model.stag = LpcaModel.stageWave;			
			this.step = step;					
			this.model.stag = LpcaModel.stageWave;			
			var selector: Vector.<int> = new Vector.<int>;
			selector.push(LpcaModel.visible)
			this.model.setVectorPoint(model.getVectorPointWithBorder(model.getVectorOracleWave(step)), selector, true);
			this.model.clearStackChange();
			selector.slice(0, selector.length);
			selector.push(LpcaModel.visibleValueWave)
			var cell: Cell = this.model.getCell(model.getStartPoint());
			cell.visibleValueWave = true;
			this.model.setCell(model.getStartPoint(), cell); 
			this.model.clearStackChange();
		}		
	}

}